<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<script>

  /*
  * new 类 得到实例
  *
  * 1. 函数里面的this指向发生了改变
  * 2. 返回值 : this
  * 3. 类里面如果有返回值 返回的是引用类型 就会返回当前的返回值 否则 返回的是实例
  *
  * */
  function Person() {
    /*new 了之后Person就当做类来使用 : */
    console.log(this);// window
    return [12,3,4];
  }

  Person.prototype.getName = function () {
    return '小三';
  };

  //
  let person = new Person();
  // person.getName();

  // 通过myNew 得到person2 就是Person的实例
  // 1. 把Class里面的this指向改变
  // 2. Class返回值 变成this
  // 3. myNew 的返回值 能调用Class原型和成员方法
  function myNew(Class, params) {
    // 返回值
    // return Class的实例

    // 能调用Class里面的方法
    // 当做返回值
    const obj = {};
    const result = Class.call(obj, params);
    // 如果是对象 没有 prototype的 如果是方法 是有prototype
    obj.__proto__ = Object.create(Class.prototype);

    if (((typeof result === 'object') && (result !== null)) || typeof result === 'function') {
      return result
    }
    return obj;
  }

  const person2 = myNew(Person, '12');
  person2.getName();

</script>
</body>
</html>
